package block

import (
	"bytes"
	"day25/tools"
	"encoding/gob"
	"strconv"
	"time"
)

/**
 ** @author: hui
 ** @email: 3231954428@qq.com
 ** @phone: 15779563913
 ** @DataTime: 2022/2/25 9:17
 **/

type Block struct{
	PrevHash  []byte
	TimeStamp int64
	Hash      []byte
	Data      []byte
	Nonce	  int64
}

/**
创建区块
*/
func NewBlock(data []byte, prevHash []byte)*Block{
	block := Block{
		PrevHash:   prevHash,
		TimeStamp : time.Now().Unix(),
		Data :      data,
	}
	block.Hash = block.GetHash()
	return &block
}

/**
 * 序列化：把结构体进行有序的排列
	把block转成[]byte
*/
func(block *Block)Serialize()([]byte,error){
	var result bytes.Buffer
	en := gob.NewEncoder(&result)

	err:= en.Encode(block)
	if err !=nil{
		return nil,err
	}
	return result.Bytes(), nil
}

/**
 * 反序列化：把[]byte转会block
 */
func DeSerialize(data []byte)(*Block,error){
	reader := bytes.NewReader(data)
	de := gob.NewDecoder(reader)
	var block *Block
	//没有地址符不会赋值
	err := de.Decode(&block)
	if err !=nil{
		return nil, err
	}
	return block,nil
}


/**
计算区块hash
函数 谁都可以使用
方法 对应的人使用， 接收者|调用者

 */

func (block *Block)GetHash()[]byte{

	/**
	拼接 bytes.Join
	第一个参数 要拼接的内容
	第二个参数 以什么形式拼接
	 */

	/**
	把int转为byte
	1、把int转为string
	2、string转为byte
	 */

	time := []byte(strconv.FormatInt(block.TimeStamp, 10))

	data := bytes.Join([][]byte{time, block.PrevHash, block.Data}, []byte{})

	return tools.SetHash(data)
}

/**
创建创世区块
 */

func GenesisBlock(data []byte)*Block{

	return NewBlock(data, nil)


}
